#include <stdio.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <unistd.h>
#include <signal.h>
#include <errno.h>
void handler( int sig_num){
	printf("父进程即将重新激活，在激活之前执行了句柄函数，内容为：父进程(%d)获得 SIGUSR1 \n", getpid());
}
int main(){
	pid_t ret;
	int status;
	int role = -1;
	ret = fork();
	if( ret > 0){
		printf("我是父进程(pid %d)\n",getpid() );
		signal( SIGUSR1, handler);
		// 表明是父进程
		role = 0;
		pause();
		printf("父进程暂停调用被挂起，开始等待子进程退出，在此激活时，会先执行子进程设置的信号句柄，如果有的话。\n");
		printf("父进程即将执行wait，将自己挂起直到子进程退出");
		ret = wait(&status);
	}else if(ret == 0){
			printf("我是子进程(pid %d)\n",  getpid());
			// 表明是子进程
			role = 1;
			sleep(1);
			printf("发送信号SIGUSR1给父进程%d，发送的格式为kill(getppid(),SIGUSR1)\n", getppid());
			kill(getppid(), SIGUSR1);
			sleep(2);
		}else{
			printf("fock子进程失败(%d)\n", errno);
		}
		// 父子进程都会执行的地方
			printf("%s: Exiting…\n", ( ( role == 0) ? "Parent" : "Child"));
	return 0;
}

